package com.manelrodriguez.applications.ibex35.adapters;

import com.manelrodriguez.applications.ibex35.to.Movimiento;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DbAdapter {
    public static final String MOVIMIENTO_ID = "_id";
    public static final String MOVIMIENTO_EMPRESA_ID = "idEmpresa";
    public static final String MOVIMIENTO_CANTIDAD = "numAcciones";
    public static final String MOVIMIENTO_PRECIO = "precioUnitario";
    public static final String MOVIMIENTO_PRECIO_COMPRA = "precioCompra";
    public static final String MOVIMIENTO_COMISION = "comision";
    
    /**
     * Sentencia SQL para la creacion de la base de datos
     */
    private static final String DATABASE_CREATE_TABLE_MOVIMIENTOS =
        "create table movimientos (_id integer primary key autoincrement, idEmpresa text, " +
        "numAcciones double, precioUnitario double, precioCompra double, comision double );";
    
    private static final String DATABASE_NAME = "cartera";
    private static final int DATABASE_VERSION = 1;
    
    private static final String DATABASE_TABLE_MOVIMIENTOS = "movimientos";
    
    private final Context mCtx;
    
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;    
    
    /**
     * Clase que se ocupa de actualizar o crear la base de datos
     */
    private static class DatabaseHelper extends SQLiteOpenHelper {
        
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);          
        }
        
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DATABASE_CREATE_TABLE_MOVIMIENTOS);      
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS movimientos");
            onCreate(db);
        }  
    }
      
    /**
     * Constructor - usa el contexto para permitir crear/abrir la base de datos
     * 
     * @param ctx el Context con el que trabajaremos
     */
    public DbAdapter(Context ctx) {
        this.mCtx = ctx;
    }
    
    /**
     * Abre la base de datos. Si no se puede abrir, intentamos crear una nueva
     * instancia de la base de datos. Si no se puede crear se lanza una excepcion
     * para indicar el fallo

     * @return this (referencia propia, permite encadenarse en una llamada de inicializaci�n)
     * @throws SQLException si la base de datos no se puede ni abrir ni crear
     */
    public DbAdapter open() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }
    
    public void close() {
        mDbHelper.close();
    }
    
    public long guardarMovimiento(Movimiento movimiento) {
        ContentValues initialValues = new ContentValues();
        initialValues.put(MOVIMIENTO_EMPRESA_ID, movimiento.getIdEmpresa());
        initialValues.put(MOVIMIENTO_CANTIDAD, movimiento.getNumAcciones());
        initialValues.put(MOVIMIENTO_PRECIO, movimiento.getPrecioUnitario());
        initialValues.put(MOVIMIENTO_PRECIO_COMPRA, movimiento.getPrecioCompra());
        initialValues.put(MOVIMIENTO_COMISION, movimiento.getComision());
        
        return mDb.insert(DATABASE_TABLE_MOVIMIENTOS, null, initialValues);          
    }
    
    /**
     * Borra un movimiento
     * @param id
     * @return
     */
    public boolean borrarMovimiento(int id) {
        return mDb.delete(DATABASE_TABLE_MOVIMIENTOS, MOVIMIENTO_ID + "=" + id, null) > 0;
    }
    
    /**
     * Borra movimientos de una empresa
     * @param id
     * @return
     */
    public boolean borrarMovimientosEmpresa(String idEmpresa) {
        return mDb.delete(DATABASE_TABLE_MOVIMIENTOS, MOVIMIENTO_EMPRESA_ID + "= '" + idEmpresa + "'", null) > 0;
    }
    
    public Cursor getMovimientos() {            
        
        String q = "SELECT * FROM " + DATABASE_TABLE_MOVIMIENTOS;
        
        return mDb.rawQuery(q, null);
    }
    
    public Cursor getMovimientosAgrupados() {            
        
        String q = "SELECT idEmpresa, sum(numAcciones),sum(precioCompra),sum(comision)  FROM " + DATABASE_TABLE_MOVIMIENTOS
        		+ " GROUP BY idEmpresa";
        
        return mDb.rawQuery(q, null);
    }
    
    
    public Cursor getMovimientosEmpresa(String empresaId) {
    	Cursor mCursor =

                mDb.query(true, DATABASE_TABLE_MOVIMIENTOS, new String[] {MOVIMIENTO_ID,
                		MOVIMIENTO_EMPRESA_ID, MOVIMIENTO_CANTIDAD, MOVIMIENTO_PRECIO, MOVIMIENTO_COMISION, MOVIMIENTO_PRECIO_COMPRA}, MOVIMIENTO_EMPRESA_ID + "= '" + empresaId + "'", null,
                        null, null, null, null);
            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
    }

    public Cursor getMovimiento(long rowId) throws SQLException {

        Cursor mCursor =

            mDb.query(true, DATABASE_TABLE_MOVIMIENTOS, new String[] {MOVIMIENTO_ID,
            		MOVIMIENTO_EMPRESA_ID, MOVIMIENTO_CANTIDAD, MOVIMIENTO_PRECIO, MOVIMIENTO_COMISION, MOVIMIENTO_PRECIO_COMPRA}, MOVIMIENTO_ID + "=" + rowId, null,
                    null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
    
    public boolean actualizarMovimiento(long rowId, Movimiento movimiento) {
    	ContentValues initialValues = new ContentValues();
        initialValues.put(MOVIMIENTO_EMPRESA_ID, movimiento.getIdEmpresa());
        initialValues.put(MOVIMIENTO_CANTIDAD, movimiento.getNumAcciones());
        initialValues.put(MOVIMIENTO_PRECIO, movimiento.getPrecioUnitario());
        initialValues.put(MOVIMIENTO_COMISION, movimiento.getComision());
        initialValues.put(MOVIMIENTO_PRECIO_COMPRA, movimiento.getPrecioCompra());

        return mDb.update(DATABASE_TABLE_MOVIMIENTOS, initialValues, MOVIMIENTO_ID + "=" + rowId, null) > 0;
    }
}
